<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// 构造函数（相当于其他语言的类，JS中没有类）
    // 用于创建特定类型的对象
    // 猫 -> 小白
    // 狗 -> 大黄
    // 人类 -> 海静

// 构造函数通常首字母大写（不是硬性规定）
// ECMA内置的构造函数：Number String Boolean Array Object Function Error ...
// ECMA允许自定义构造函数
// 当一个函数使用new运算符调用并用于创建实例对象时，该函数称为 构造函数

// this是一个关键字，是一个指针型变量
// 在JS中this并不是固定的，它会随着执行环境的改变而改变

// 1.在全局访问this时，它指向window对象
// console.log( this );// window

// 2.通常在函数中使用this关键字，它指向函数的调用对象
function fun(){
    console.log( this );
}
fun();// this -> window
window.fun();// this -> window

// 3.构造函数内部给this添加属性和方法，this指向创建出来的实例对象
function Human(){// 构造函数
    this.name = '海静';
    this.age = 48;
    this.sex = '妖';
    this.sayHi = function (){
        console.log( 'hi' );
    }
}
var person1 = new Human();// 实例对象
console.log( person1 );// Human {name: '海静', age: 48, sex: '妖', sayHi: ƒ}

// 当成普通函数调用
var result = Human();// this -> window
console.log( result );// undefined
console.log( window );


// 普通函数
function test(){

}

// 构造函数
function Test(){

}

// var res1 = test();
// var res2 = new Test();
// console.log( res1 );// undefined
// console.log( res2 );// Test {}

// var res3 = new test();
// var res4 = Test();
// console.log( res3 );// test {}
// console.log( res4 );// undefined

</script>
</body>
</html>